#include<stdio.h>
#include<stdlib.h>
/*
 * 存取二进制文件(结构体数组)
 */

typedef struct{
	char name[20];
	int age;
	float score;
} Student;

int main()
{
	//将结构体类型数据存储到二进制文件
	FILE* fp = fopen("students.dat","wb");
	if(fp==NULL){
		printf("打开文件失败!\n");
		return -1;
	}

	Student stu[] = {
			{"楚老大",33,95.5},
			{"陈老二",32,97},
			{"张老三",31,99},
			{"李老四",30,98},
			{"王老五",29,96},
			{"赵老六",28,97.5}
		};
	//输出到二进制文件.
	//参数1：数据指针； 参数2：结构体大小(块大小)；参数3：结构体数量(数据块数)
	int size = 6;   //表示要存储的结构体数量
	fwrite(&size, sizeof(int), 1, fp);
	fwrite(stu, sizeof(stu), size, fp); 
	fclose(fp);




	//从二进制文件读取数据
	FILE* f = fopen("students.dat","rb");
	if(f==NULL){
		printf("打开文件失败!");
		return -1;
	}
	//从二进制文件读取数据，参数含义同fwrite函数
	int count;
	fread(&count,sizeof(int),1,f);
	Student* pStu = NULL;
    if(count>0){
		//动态分配内存	
		pStu = (Student*)malloc(count*sizeof(Student));
		//从二进制文件里读取结构体数组
		if(pStu!=NULL){
			fread(pStu,sizeof(Student),count,f);
		}
		//输出到显示器
		for(int i=0; i<size; i++){
			printf("%s %d %.2f\n", pStu[i].name, pStu[i].age, pStu[i].score);
		}
		//释放内存
		free(pStu);
		pStu = NULL;
	}

	fclose(f);

	return 0;
}
